﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace MontagsmalerApp
{
	/// <summary>
	/// Repräsentiert einen Spielteilnehmer. Dies kann eine Einzelperson oder ein Team sein.
	/// </summary>
	[Serializable]
	public abstract class Spielteilnehmer : INotifyPropertyChanged
	{
		/// <summary>
		/// Erstellt eine neue Instanz der Spielteilnehmer-Klasse mit dem angegebenen Namen.
		/// </summary>
		/// <param name="name"></param>
		public Spielteilnehmer(string name)
		{
			Name = name;
		}

    /// <summary>
    /// Name des Spielteilnehmers
    /// </summary>
    private string _name;

		/// <summary>
		/// Der Name des Spielteilnehmers.
		/// </summary>
    public string Name
    {
      get
      {
        return _name;
      }
      set
      {
        _name = value;
        OnPropertyChanged("Name");
        OnPropertyChanged("NamePunkte");
      }
    }

		public string NamePunkte
		{
			get
			{
				return Name + " (" + GetAktuellePunkte() + ")";
			}
		}

		/// <summary>
		/// Gibt die aktuelle Punktzahl des Spielteilnehmers zurück.
		/// </summary>
		public abstract int GetAktuellePunkte();

		/// <summary>
		/// Setzt die Punkte auf den Anfangswert zurück.
		/// </summary>
		public abstract void PunkteZuruecksetzen();

		/// <summary>
		/// Name des Spielers und Punktzahl in Klammern.
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			return Name + " (" + GetAktuellePunkte() + ")";
		}

		/// <summary>
		/// Addiert die angegebene Punktzahl zu den bisherigen Punkten dazu.
		/// </summary>
		/// <param name="neuePunktzahl"></param>
		public abstract void AddierePunkte(int neuePunktzahl);

    [field:NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propName)
    {
      if (PropertyChanged != null)
      {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
      }
    }
  }
}

